package org.anarres.gradle.plugin.jnaerator; import com.ochafik.lang.jnaerator.JNAerator; import com.ochafik.lang.jnaerator.JNAeratorCommandLineArgs; import com.ochafik.lang.jnaerator.JNAeratorConfig; import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.annotation.Nonnull; import org.codehaus.groovy.runtime.DefaultGroovyMethods; import org.gradle.api.DefaultTask; import org.gradle.api.file.FileCollection; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.OutputDirectory; import org.gradle.api.tasks.TaskAction; /** * * @author shevek */ public class JNAeratorTask extends DefaultTask { // private static final Logger LOG = LoggerFactory.getLogger(JNAeratorTask.class); @OutputDirectory private File outputDir; @Input private String libraryName; @Input private String packageName; @InputFiles private FileCollection headerFiles; @Input private JNAeratorConfig.Runtime runtimeMode = JNAeratorConfig.Runtime.JNA; @Input private final Set<String> define = new HashSet<String>(); @Input private final Set<String> undefine = new HashSet<String>(); @Input private List<String> extraArgs = new ArrayList<String>(); @OutputDirectory public File getOutputDir() { getLogger(); return outputDir; } public void setOutputDir(@Nonnull Object outputDir) { this.outputDir = getProject().file(outputDir); } public void outputDir(@Nonnull Object outputDir) { setOutputDir(outputDir); } @Input public String getLibraryName() { return libraryName; } public void setLibraryName(@Nonnull String libraryName) { // LOG.info("setLibraryName: " + libraryName); this.libraryName = libraryName; } public void libraryName(@Nonnull String libraryName) { setLibraryName(libraryName); } @Input public String getPackageName() { return packageName; } public void setPackageName(@Nonnull String packageName) { this.packageName = packageName; } public void packageName(@Nonnull String packageName) { setPackageName(packageName); } @InputFiles public FileCollection getHeaderFiles() { // LOG.info("getHeaderFiles = " + headerFiles); return headerFiles; } public void setHeaderFiles(@Nonnull Object... headerFiles) { // LOG.info("setHeaderFiles = " + headerFiles); this.headerFiles = getProject().files(headerFiles); } public void headerFiles(@Nonnull Object... headerFiles) { setHeaderFiles(headerFiles); } @Nonnull public JNAeratorConfig.Runtime getRuntimeMode() { return runtimeMode; } public void setRuntimeMode(@Nonnull JNAeratorConfig.Runtime runtimeMode) { this.runtimeMode = runtimeMode; } public void runtimeMode(@Nonnull Object runtimeMode) { if (runtimeMode instanceof JNAeratorConfig.Runtime) this.runtimeMode = (JNAeratorConfig.Runtime) runtimeMode; else this.runtimeMode = JNAeratorConfig.Runtime.valueOf(String.valueOf(runtimeMode)); } public void define(@Nonnull Object... args) { for (Object arg : args) define.add(String.valueOf(arg)); } public void undefine(@Nonnull Object... args) { for (Object arg : args) undefine.add(String.valueOf(arg)); } @Nonnull public List<String> getExtraArgs() { return extraArgs; } public void setExtraArgs(@Nonnull List<String> extraArgs) { this.extraArgs = extraArgs; } public void extraArgs(@Nonnull Object... extraArgs) { for (Object arg : extraArgs) this.extraArgs.add(String.valueOf(arg)); } @TaskAction public void run() { List<String> args = new ArrayList<String>(); args.add(JNAeratorCommandLineArgs.OptionDef.CurrentLibrary.clSwitch); args.add(getLibraryName()); args.add(JNAeratorCommandLineArgs.OptionDef.CurrentPackage.clSwitch); args.add(getPackageName()); for (File file : getHeaderFiles()) args.add(file.getAbsolutePath()); args.add(JNAeratorCommandLineArgs.OptionDef.OutputMode.clSwitch); args.add(JNAeratorConfig.OutputMode.Directory.name()); args.add(JNAeratorCommandLineArgs.OptionDef.Runtime.clSwitch); args.add(getRuntimeMode().name()); args.add(JNAeratorCommandLineArgs.OptionDef.OutputDir.clSwitch); // String outputPath = getPackageName().replace('.', File.separatorChar); // File outputDir = new File(getOutputDir(), outputPath); args.add(getOutputDir().getAbsolutePath()); args.add(JNAeratorCommandLineArgs.OptionDef.ForceOverwrite.clSwitch); // args.add(JNAeratorCommandLineArgs.OptionDef.Verbose.clSwitch); args.add("-v"); for (String d : define) args.add("-D" + d); for (String u : undefine) args.add("-U" + u); args.addAll(getExtraArgs()); DefaultGroovyMethods.deleteDir(outputDir); outputDir.mkdirs(); getLogger().info("Invoking jnaerator " + args); JNAerator.main(args.toArray(new String[args.size()])); } }